package com.adong.dao.imlp;


import com.adong.utils.JdbcUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

/**
 * 基础的Dao包,使用的dbutils Jar包中的方法
 *
 * @author adong
 */
public abstract class BaseDao<T> {

    private Class<T> clazz;

    //找到继承子类的泛型参数
    {
        //获取当前BaseDAO的子类继承的父类中的泛型
        Type genericSuperclass = this.getClass().getGenericSuperclass();
        ParameterizedType paramType = (ParameterizedType) genericSuperclass;

        Type[] typeArguments = paramType.getActualTypeArguments();//获取了父类的泛型参数
        clazz = (Class<T>) typeArguments[0];//泛型的第一个参数

    }

    private QueryRunner queryRunner = new QueryRunner();

    /**
     * 增删改数据
     *
     * @param sql  数据库语句
     * @param args 占位符
     * @return 返回-1操作失败, 成功返回操作的行数
     */
    protected int update(String sql, Object... args) {
        Connection conn = null;
        conn = JdbcUtils.getConnection();
        try {
            return queryRunner.update(conn, sql, args);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }

    /**
     * 查询数据库中一条字段
     *
     * @param sql  操作的sql
     * @param args 占位符
     * @return 查询成功返回对象 ,失败为null
     */
    protected T queryForOne(String sql, Object... args) {
        Connection conn = null;

        conn = JdbcUtils.getConnection();
        try {
            return queryRunner.query(conn, sql, new BeanHandler<T>(clazz), args);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }


    }

    /**
     * 查询数据中的多条字段
     *
     * @param sql  操作的sql语句
     * @param args 占位符
     * @return 返回 成功为对象List集合,没有为null
     */
    protected List<T> queryForList(String sql, Object... args) {
        Connection conn = null;

        conn = JdbcUtils.getConnection();
        try {
            return queryRunner.query(conn, sql, new BeanListHandler<T>(clazz), args);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }

    /**
     * 查询单个值
     *
     * @param sql  操作的sql语句
     * @param args 占位符
     * @return 放回E类型(泛型方法)
     */
    protected Object queryGetOneValue(String sql, Object... args) {
        Connection conn = null;

        conn = JdbcUtils.getConnection();
        try {
            return queryRunner.query(conn, sql, new ScalarHandler(), args);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }

}
